package cn.kgc.springcloud.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 课工场
 * @date 2024/10/17
 * @description   hystrix  服务调用出现异常  则会直接通过fallback实现快速响应
 * 给服务的调用方 返回一个可处理 符合预期的结果  让资源得到及时的释放
 *
 * 当请求的异常比例达到一定的阈值时,hystrix可以将该服务熔断
 * 阈值:
 * 10s内有20个请求异常
 * 10s内有50%的请求异常
 *
 * 达到阈值后服务被熔断,熔断后的服务会被保护5s时间,在5s内该服务被隔离,任何请求都会被进行快速响应
 * 保护时间结束后,服务状态进入半开状态,允许转发一次请求到目标服务
 * 如果转发的请求被服务器正常处理,则该服务正常接入服务调用链,否则,这一次转发的请求就会将该服务再次进入熔断状态,
 * 进入下一个保护周期
 *
 */
@RestController
@RequestMapping("hystrix")
public class HystrixController {

    @GetMapping("m1")
    @HystrixCommand(fallbackMethod = "method1Fallback")
    public String method1(Integer id){
        System.out.println("-----------method1------------");
        if (id<0){
            throw  new RuntimeException("参数异常,id = "+id);
        }
        return "HystrixController method1 ok ";
    }


    // 快速响应方法  快速响应方法在设计时 要保持和原方法的参数和返回值类型一致
    // 在快速响应方法被调用时 会将原方法的参数传入
    public String method1Fallback(Integer id){
        System.out.println("-----------method1Fallback--------------");
        return "参数异常,id = "+id;
    }

}
